home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 20
/
Cream of the Crop 20 (Terry Blount) (1996).iso
/
program
/
skeleton.zip
/
WinMain.asm
< prev
next >
Wrap
Assembly Source File
|
1996-06-02
|
3KB
|
148 lines
TITLE WinMain
INCLUDE COMMON.INC
.CONST
szClassName SBYTE "Skeleton",0h
.DATA?
hInst HINSTANCE ?
lpCmdLine LPSTR ?
nCmdShow SDWORD ?
szWindowName SBYTE (MAX_PATH + 10h) DUP (0h)
hMainWnd HWND ?
hAccel HACCEL ?
.CODE
Start: INVOKE GetModuleHandle, NULL
mov hInst,eax
INVOKE GetCommandLine
mov lpCmdLine,eax
mov nCmdShow,SW_SHOWDEFAULT
INVOKE WinMain, hInst, 0h, lpCmdLine, nCmdShow
INVOKE ExitProcess, eax ;eax=Exit Code
OnlyOneInstance PROC STDCALL
LOCAL hSemaphore:HANDLE
INVOKE CreateSemaphore, NULL, 0h, 1h, ADDR szClassName
mov hSemaphore,eax
INVOKE GetLastError
cmp eax,ERROR_ALREADY_EXISTS
je caseEXISTS
cmp eax,ERROR_SUCCESS
je caseONLYONE ;if not equal then CreateSemaphore failed so
jmp caseFIND ;return FALSE to exit by trying FindWindow
caseONLYONE: mov eax,TRUE ;created Semaphore will prevent other instances
jmp caseRETURN ;return TRUE to continue
caseEXISTS: INVOKE CloseHandle, hSemaphore
caseFIND: INVOKE FindWindow, ADDR szClassName, NULL
test eax,eax
jz caseRETURN ;return FALSE (eax=0) to exit
INVOKE GetLastActivePopup, eax
mov hMainWnd,eax ;eax=hMainWnd or hPopupWnd
INVOKE IsIconic, hMainWnd
test eax,eax
jz @F
INVOKE ShowWindow, hMainWnd, SW_RESTORE
xor eax,eax
jmp caseRETURN ;return FALSE (eax=0) to exit
@@: INVOKE SetForegroundWindow, hMainWnd
xor eax,eax ;return FALSE (eax=0) to exit
caseRETURN: ret
OnlyOneInstance ENDP
Initialization PROC STDCALL
LOCAL wcex:WNDCLASSEX
mov wcex.cbSize,SIZEOF(WNDCLASSEX)
mov wcex.style,CS_HREDRAW + CS_VREDRAW
mov wcex.lpfnWndProc, OFFSET WndProc
xor eax,eax
mov wcex.cbClsExtra,eax
mov wcex.cbWndExtra,eax
mov eax,hInst
mov wcex.hInstance,eax
INVOKE LoadIcon, hInst, IDI_ICON
mov wcex.hIcon,eax
INVOKE LoadCursor, NULL, IDC_ARROW
mov wcex.hCursor,eax
mov wcex.hbrBackground,COLOR_WINDOW + 1
mov wcex.lpszMenuName,IDM_MENU
mov wcex.lpszClassName,OFFSET szClassName
INVOKE LoadImage, hInst, IDI_ICON, IMAGE_ICON, 16, 16, NULL
mov wcex.hIconSm,eax
INVOKE RegisterClassEx, ADDR wcex
test eax,eax
jz caseRETURN ;return FALSE (eax=0) to exit
INVOKE CreateWindowEx, NULL,\
ADDR szClassName, ADDR szClassName,\
WS_OVERLAPPEDWINDOW,\
0h, 0h, 1A0h, 180h, NULL, NULL, hInst, NULL
test eax,eax
jz caseRETURN ;return FALSE (eax=0) to exit
mov hMainWnd,eax
INVOKE ShowWindow, hMainWnd, nCmdShow
INVOKE UpdateWindow, hMainWnd
caseRETURN: ret
Initialization ENDP
WinMain PROC STDCALL, hInstance:HINSTANCE, hPrevInstance:HINSTANCE, pCmdLine:LPSTR, CmdShow:SDWORD
LOCAL msg:MSG
call OnlyOneInstance
test eax,eax
jz caseRETURN
call Initialization
test eax,eax
jz caseRETURN
INVOKE LoadAccelerators, hInst, IDA_ACCEL
test eax,eax
jz caseRETURN
mov hAccel,eax
MessageLoop: INVOKE GetMessage, ADDR msg, NULL, 0h, 0h
test eax,eax ;FALSE (eax=0) if WM_QUIT
jz caseWM_QUIT
INVOKE TranslateAccelerator, msg.hwnd, hAccel, ADDR msg
test eax,eax
jnz MessageLoop
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
jmp MessageLoop
caseWM_QUIT: mov eax,msg.wParam ;wParam=Exit Code
caseRETURN: ret
WinMain ENDP
END Start